package demo03;

public class Demo02Synchronized {
    public static void main(String[] args) {
        Runnable sellTicket = new Runnable() { // 布置线程任务：售100张票
            private int ticket = 100; // 票总数100张
            Object lock = new Object(); // 设置锁对象

            @Override
            public void run() { // 每个线程开始任务的起点
                while (true) { // 无限循环，窗口一直开放
                    /*
                     *  在判断语句之前，设置同步代码块，上锁
                     *  第一个抢到优先权的线程抢到这把锁，进入同步代码块执行语句，其他线程只能在外面等着
                     *  线程在同步代码块执行完毕后，重新上锁，并将锁继续给优先权高的线程，执行里面的语句
                     *  如此往复，同步代码块内的代码就只会有一条线程在执行，防止了线程安全问题
                     */
                    synchronized (lock) {
                        if (ticket > 0) { // 票数大于0，代表有票可售，进行售票
                            try { // 模拟出票时间
                                Thread.sleep(50);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            System.out.println(Thread.currentThread().getName() + "正在卖：" + ticket--); // 售1张票
                        }
                    }
                }
            }
        };

        // 开启三个线程：三个窗口
        new Thread(sellTicket, "窗口1").start();
        new Thread(sellTicket, "窗口2").start();
        new Thread(sellTicket, "窗口3").start();

        /*
         *  输出结果：各个窗口交替输出，输出的内容按顺序从100~1
         */
    }
}
